/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package control;

import java.io.FileNotFoundException;
import view.Main;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author JeppeJensen
 */
public final class SQLCommunication {

    private Main main;
    private Connection conn;
    private Statement stmt;
    private String host;
    private int portnr;
    private String database;
    private String udb;
    private String pdb;

    public SQLCommunication(Main main) {
        this.main = main;
        /*------------------DATABASEINFO---------------------*/
        /**/ host = "localhost";                           /**/
        /**/ portnr = 3306;                                /**/
        /**/ database = "nvt";                             /**/
        /**/ udb = "root"; //username til database         /**/
        /**/ pdb = "root";  //Password til database.       /**/ 
        /*---------------------------------------------------*/
        IniFileReaderWriter iniFileWriter = new IniFileReaderWriter(host, portnr, database, udb, pdb);
        try {
//            iniFileWriter.writeFile();
            iniFileWriter.readFilE();
            host = iniFileWriter.getHost();
            portnr = iniFileWriter.getPortnr();
            database = iniFileWriter.getDatabase();
            udb = iniFileWriter.getUdb();
            pdb = iniFileWriter.getPdb();
        } catch (IOException ex) {
            System.out.println("Der er sket en fejl ved indlæsning af ini-filen. Man bruger bare default til at logge på MySQL-serveren.");
            main.warningMsg("Der er sket en fejl ved indlæsning af ini-filen. \nStandard login-data bliver brugt til at logge på MySQL-serveren.");
        }
    }

    /**
     * Select-metoden bør blot returnere et resultset som vi så skal bearbejde
     * med en while(rs.next) i den klasse man kalder den i.
     *
     * @param tabel
     * @return resultset fra execution af den kaldte SQL-streng.
     */
    public ResultSet select(String tabel, String sql) {
        ResultSet rs = null;
        try {
//            System.out.println("Tabel:" + tabel);
//            System.out.println("Sql:" + sql);
            if (conn == null) {
                main.warningMsg("Der er ikke oprettet forbindelse mod databasen.");
            } else {
                rs = stmt.executeQuery(sql);
            }
        } catch (SQLException ex) {
            System.out.println("Fejl ved hentning af " + tabel + " fra database \nDen kørte sql-string=" + sql);
        }
        return rs;
    }

    public void insert(String tabel, String sql) {
        try {
            if (isConnectionClosed()) {
                main.warningMsg("Der er ikke oprettet forbindelse mod databasen.");
            } else {
                stmt.execute(sql);
            }
        } catch (SQLException ex) {
            System.out.println("Der er sket en fejl i forbindelse med indsætning af objekt i " + tabel + "\n" + sql);
            main.warningMsg("Der er sket en fejl i forbindelse med indsætning af objekt i " + tabel + "\n" + sql);
        }
    }

    public void update(String tabel, String sql) {
        try {
            stmt.execute(sql);
        } catch (SQLException ex) {
            System.out.println("Der er sket en fejl i forbindelse med opdatering af " + tabel);
        }
    }

    public void delete(String tabel, String sql) {
        try {
            if (isConnectionClosed()) {
                main.warningMsg("Der er ikke oprettet forbindelse mod databasen.");
            } else {
                stmt.execute(sql);
                System.out.println(tabel + " er nu slettet.");
            }
        } catch (SQLException ex) {
            System.out.println("Der er sket en fejl i forbindelse med sletning af " + tabel);
        }
    }

    public void openConn() throws SQLException {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://" + host + ":" + portnr + "/" + database; //HUSK AT ÆNDRE PORT
            conn = DriverManager.getConnection(url, udb, pdb); //HUSK AT ÆNDRE PASSWORD HVIS DET IKKE ER DET SAMME
            stmt = conn.createStatement();
            System.out.println("Connection er oprettet!");
        } catch (ClassNotFoundException ex) {
            System.out.println("Driveren er ikke fundet");
        }
    }

    public boolean isConnectionClosed() {
        boolean closed = false;
        try {
            closed = conn.isClosed();
        } catch (SQLException ex) {
            Logger.getLogger(SQLCommunication.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Fejl ved tjek af connection i SQL-Communication");
        }
        return closed;
    }

    public void closeConn() {
        try {
            conn.close();
        } catch (SQLException ex) {
            System.out.println("Forsøg på conn.close(). Der er ingen connections åbne");
        }
    }

    public void setPortnr(int portnr) {
        this.portnr = portnr;
    }

    public void setDatabase(String database) {
        this.database = database;
    }

    public void setUdb(String udb) {
        this.udb = udb;
    }

    public void setPdb(String pdb) {
        this.pdb = pdb;
    }
}
